#ifndef MATRICES_H
#define MATRICES_H

#include <iostream>
#include <QImage>

class Matrices
{
private:
    int hauteur;
    int largeur;
    int ** matrice;

    static int getMedianne(int tableau[]);
    static void triFusionAux(int tableau[], const int debut, const int fin);
    static void fusion(int tableau[],const int debut1,const int fin1,const int fin2);

public:
    explicit Matrices(int hauteur, int largeur);

    ~Matrices();

    void setValeurDansCase(int i, int j, int valeur);
    void remplirMatriceDe(int valeur);

    int getValeurDansCase(int i, int j);
    int getHauteur();
    int getLargeur();
    int getSommeCoef();

    bool isPositionValide(int i, int j);

    static void convolution(QImage * image, Matrices * noyau, double sommeCoef = 0);
    static Matrices * convolutionGrise(QImage * image, Matrices * noyau, double sommeCoef = 0);
    static void convolutionMedianne(QImage * image);
    static void triFusion(int tableau[], const int longueur);

    static Matrices * image3Dto1D(QImage * image);
    static void cheminVerticalDEnergieMinimale(QImage * image);
    static void cheminHorizontalDEnergieMinimale(QImage * image);

    static Matrices * getNoyauGaussien(int tailleNoyau);
    static Matrices * getNoyauGaussien3();
    static Matrices * getNoyauGaussien5();
    static Matrices *getNoyauGaussien7();
    static Matrices *getNoyauGaussien9();
    static Matrices * getNoyauMoyenneCarreDeTaille(int taille);

    static Matrices *getNoyauSobelKernelX();
    static Matrices *getNoyauSobelKernelY();

    static Matrices *getNoyauRobertsKernelX();
    static Matrices *getNoyauRobertsKernelY();

};

#endif // MATRICES_H
